package org.thread.test00.demo08.t01;

/**
 * @author ZQX
 * @date 2025-03-13
 */
public class MyRunnable implements Runnable {

    /**
     * 帐号
     */
    private Account account;

    /**
     * 取钱用户
     */
    private String user;

    /**
     * 取钱金额
     */
    private double money;

    /**
     * 锁对象 - 唯一性
     */
    private static final Object LOCK = new Object();

    public MyRunnable() {
    }

    public MyRunnable(Account account, String user, double money) {
        this.account = account;
        this.user = user;
        this.money = money;
    }


    /**
     * 注意：在此案例中，不能把 run 方法声明为同步方法
     * 因为同步方法默认的锁对象为 this ，在测试代码中，创建了两个 MyRunnable 对象，
     * 两个线程指定的 this 不是一样的，因此解决不了线程安全问题
     * <p>
     * 解决：把同步 run 方法，修改为同步块
     */
    @Override
    public void run() {
        synchronized (LOCK) {
            account.getMoney(user, money);
        }
    }

    // public void run() {
    //     synchronized (this) {
    //         account.getMoney(user, money);
    //     }
    // }
}
